Code
library(knitr)
library(dplyr)
library(questionr)
library(sf)
library(mapsf)
library(ggplot2)Révisions de statistique bivariée
Claude Grasland
March 9, 2026
Dans cette première exploration on va commencer en prendre en main les données en se donnant comme objectif d’étudier les variations de précarité énergétique entre les quartiers de la commune de Rouen. On se limitera à l’utilisation d’outils statistiques - apparemment - simples de statistique bivariée que l’on complexifiera progressivement.
On extrait du fond de carte des 42 IRIS la commune de Rouen et on crée un fonds de carte regroupant ceux-ci en 10 quartiers.
map_iris <- readRDS("data/mapiris.RDS") %>% filter(substr(iris_code,1,5)=="76540")
map_quart <- map_iris %>% group_by(quart_code, quart_name) %>%
summarise()
map_com <- map_iris %>% summarise()
mf_map(map_iris, type="typo",var="quart_code", border="white",lwd=0.5, leg_title = "Quartiers")
mf_map(map_quart, type = "base", col=NA, add=T, border="black",lwd=1)
mf_layout("Iris et quartiers de Rouen", frame = T, credits = "Source : IGN")On extrait du fichier DPE les diagnistics relatifs à la commune de Rouen et on sélectionne un nombre volontairement limité d’indicateurs.
map_dpe<-readRDS("data/dpe.RDS") %>%
filter(com_code == "76540",
substr(quart_code,1,5) == "76540") %>%
select(quart_code,
quart_name,
dpe,
sup,
con_tot,
con_m2,
dat,
typ) %>%
mutate(quart_code = as.character(quart_code),
quart_name = as.character(quart_name))
don<-st_drop_geometry(map_dpe) %>% filter(is.na(dpe)==F,
is.na(con_m2)==F)
kable(head(don), caption= "Extrait du fichier DPE")| quart_code | quart_name | dpe | sup | con_tot | con_m2 | dat | typ |
|---|---|---|---|---|---|---|---|
| 7654001 | Centre Rive Droite Ouest | D | 56.7 | 13449.7 | 237.2 | 1900 | appartement |
| 7654006 | Quartiers Est | F | 90.6 | 29722.1 | 328.0 | 1948 | appartement |
| 7654001 | Centre Rive Droite Ouest | D | 70.0 | 12936.9 | 192.0 | 1949 | maison |
| 7654003 | Centre Rive Gauche | G | 19.7 | 15175.8 | 769.1 | 1949 | appartement |
| 7654001 | Centre Rive Droite Ouest | D | 62.1 | 15101.9 | 243.0 | 1947 | appartement |
| 7654002 | Centre Rive Droite Est | E | 35.7 | 4503.5 | 289.0 | 1948 | appartement |
On superpose les deux sources de données en utilisant les localisations du fichier dpe :
Quelle est la variable que nous souhaitons analyser ? Les passoires énergétiques sont en principe définies par l’appartenance aux catégories énergétiques F et G.
Quelle est la distribution générale des étiquettes énergétiques ? Réalisons un tableau et un graphique.
| n | % | %cum | |
|---|---|---|---|
| A | 144 | 0.3 | 0.3 |
| B | 1194 | 2.2 | 2.5 |
| C | 15512 | 29.1 | 31.6 |
| D | 17211 | 32.3 | 64.0 |
| E | 11988 | 22.5 | 86.5 |
| F | 4209 | 7.9 | 94.4 |
| G | 2987 | 5.6 | 100.0 |
Même si la correspondance n’est pas parfaite, il existe un lien étroit entre la consommation d’énergie primaire par m2 de logement habitable (en log) et l’étiquette DPE attribuée par l’ADEME.
# Graphique R-Base
mypal7<-c("green4","green3","lightgreen","yellow","goldenrod1","darkorange","red")
boxplot(don$con_m2~don$dpe,
col=mypal7,
cex=0.2,
log ="y",
xlab="Consommation d'énergie primaire par m2",
ylab = "Etiquette DPE",
main="Relation entre étiquettes et consommation d'énergie",
sub = "Source : Base DPE, Commune de Rouen")
grid(lwd=1)#Graphique ggplot2
mypal7<-c("green4","green3","lightgreen","yellow","goldenrod1","darkorange","red")
ggplot(don) + aes(x=dpe,y=con_m2)+
geom_violin(aes(fill=dpe)) +
scale_y_log10("Consommation d'énergie primaire par m2") +
scale_x_discrete("Etiquette DPE")+
scale_fill_manual(values=mypal7) +
theme_light() +
ggtitle(label = "Relation entre étiquettes et consommation d'énergie",
subtitle = "Source : Base DPE, Commune de Rouen"
)Ceci suggère que l’analyse pourrait dans certains cas porter sur cette variable quantitative continue plutôt que sur la variable qualitative ordinale qu’est l’étiquette. Mais en utilisant de préférence une échelle logarithmique.
On peut assez facilement déduire empiriquement le seuil d’apparition des passoires énergétiques à l’aide d’un modèle Logit :
Call:
glm(formula = dpe2 ~ con_m2, family = "binomial", data = don)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.745e+01 2.346e-01 -74.39 <2e-16 ***
con_m2 4.891e-02 6.818e-04 71.74 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 42176.3 on 53244 degrees of freedom
Residual deviance: 9537.9 on 53243 degrees of freedom
AIC: 9541.9
Number of Fisher Scoring iterations: 9
plot(mod1$data$con_m2,
mod1$fitted.values,
cex=0.1,
pch=20,
col="red",
log="x",
main = "Résultat du modèle Logit",
xlab = "Consommation d'énergie primaire par m2",
ylab = "Probabilité d'être une passoire énergétique",
subtitle = "Source : Base DPE, Commune de Rouen")
points(357, 0.5, pch=20, cex=2)
text(100, 0.55, "Probabilité = 0.5", col="blue")
text(357, 0.01, "357 Kwh/m2/an", col="blue")
abline(h=0.5, lty=2, col = "blue")
abline(v=357, lty=2, col= "blue")La valeur seuil obtenue est de 357 Kwh/m2, ce qui est légèrement supérieur à la valeur de référence donnée par l’ADEME qui est de 330 Kwh/m2/an pour le passage de la catégorie E à la catégorie F. On peut vérifier que l’approximation est nénamoins très proche de la réalité en comparant les passoires énergétiques déclarées par l’ADEME et l’estimation faite à partir du seuil observé grâce au modèle Logit :
Si on part de la variable booléenne, on obtient facilement un pourcentage de passoires énergétiques par quartier :
| Code | Nom | Total | N | % |
|---|---|---|---|---|
| 7654008 | Chatelet Lombardie | 2079 | 0 | 0.00 |
| 7654009 | Grand Mare | 2622 | 40 | 1.53 |
| 7654007 | Sapins | 2439 | 175 | 7.18 |
| 7654010 | Saint-Clément-Jardin des Plantes | 6676 | 506 | 7.58 |
| 7654003 | Centre Rive Gauche | 7352 | 571 | 7.77 |
| 7654006 | Quartiers Est | 3184 | 399 | 12.53 |
| 7654002 | Centre Rive Droite Est | 8133 | 1020 | 12.54 |
| 7654004 | Quartiers Ouest | 7145 | 1020 | 14.28 |
| 7654001 | Centre Rive Droite Ouest | 9664 | 2350 | 24.32 |
| 7654005 | Coteaux Nord | 3951 | 1115 | 28.22 |
On peut cartogaphier le résultat pour visualiser la distribution dans la commune :
map2 <- map_quart %>% left_join(tab1)
mf_map(map2, type="choro",var="pct",
breaks=c(0,5,10,20,100),
leg_title = "% passoires",
leg_val_rnd = 0,
leg_pos = "topleft")
mf_map(map2, type="prop", var="pas",
leg_title = "nb. passoires",
leg_pos = "topright",
inches=0.2,
col="red")
mf_layout("Distribtion des passoires énergétiques par quartiers à Rouen",
arrow = F,
frame = T,
credits = "Source : IGN & ADEME")Supposons maintenant que l’on veuille calculer pour chaque quartier la valeur moyenne de conosmmation d’énergie par m2.
tab1 <- don %>% group_by(quart_code, quart_name) %>%
filter(is.na(con_tot)==F,
is.na(sup) ==F) %>%
summarise(con_tot = sum(con_tot),
sup = sum(sup)) %>%
mutate(con_m2 = con_tot/sup) %>%
arrange(con_m2)
kable(tab1,
digits = c(0,0,0,0,2),
col.names = c("Code","Nom","Consommation totale", "Surface", "Consommation / m2"),
caption = "Consommation moyenne d'énergie primaire par m2 selon les quartiers")| Code | Nom | Consommation totale | Surface | Consommation / m2 |
|---|---|---|---|---|
| 7654008 | Chatelet Lombardie | 20502860 | 133059 | 154.09 |
| 7654010 | Saint-Clément-Jardin des Plantes | 73275344 | 407292 | 179.91 |
| 7654009 | Grand Mare | 34340742 | 188199 | 182.47 |
| 7654003 | Centre Rive Gauche | 75064211 | 393148 | 190.93 |
| 7654006 | Quartiers Est | 36867568 | 171576 | 214.88 |
| 7654004 | Quartiers Ouest | 76970066 | 347701 | 221.37 |
| 7654002 | Centre Rive Droite Est | 83604011 | 373750 | 223.69 |
| 7654007 | Sapins | 29975978 | 133836 | 223.98 |
| 7654005 | Coteaux Nord | 60592161 | 221901 | 273.06 |
| 7654001 | Centre Rive Droite Ouest | 122574781 | 444471 | 275.78 |
On peut cartogaphier le résultat pour visualiser la distribution dans la commune :
map2 <- map_quart %>% left_join(tab1)
mf_map(map2, type="choro",var="con_m2",
breaks=c(150,180,220,240,280),
leg_title = "Kwh/m2/an",
leg_val_rnd = 0,
leg_pos = "topleft")
mf_map(map2, type="prop", var="con_tot",
leg_title = "Kwh",
leg_pos = "topright",
inches=0.2,
col="red")
mf_layout("Consommation d'énergie primaire par quartier à Rouen",
arrow = F,
frame = T,
credits = "Source : IGN & ADEME")